package qgs.zisu.javaconcurrency.javaconcurrency.chapter6_forceOrGracefulClose;

/**
 * @Author: 蔡翔
 * @Date: 2019/9/26 10:43
 * @Version 1.0
 */
public class ThreadService {

    private Thread executeThread;
    private boolean finished = false;
    public void execute(Runnable task){
        // 当执行execute方法的时候， executeThread线程也启动了。
        executeThread = new Thread(){
            @Override
            public void run(){
                //task 其实是一个Runnable类型的接口，调用它的地方要实现这个接口，而Thread就相当于一个执行器，去执行这个Runnable
                // 如果这个task 没有结束，那么 runner线程会阻塞在那里动不了。
                Thread runner = new Thread(task);
                runner.setDaemon(true);
                runner.start();

                try {
                    // 如果这个task 是比较复杂的任务，下面有join ，那么 执行线程 就会在这里阻塞住。永远不会吧finish变成true
                    runner.join();
                    finished = true;
                } catch (InterruptedException e) {
                    //e.printStackTrace();
                }
            }
        };
        executeThread.start();
    }

    // 我最多等你 mills 这么久，你要是再不执行完成，我就把你强制关闭。
    public void shutdown(long mills){
        long currentTime = System.currentTimeMillis();
        while (!finished){
            if((System.currentTimeMillis()-currentTime)>= mills){
                System.out.println("任务超时了。需要结束它");
                //这里调用interrupt 上面executeThread 就会报异常并且捕捉。
                executeThread.interrupt();
                break;
            }
            try {
                Thread.sleep(10);
            }catch (Exception e){
                System.out.println("执行线程被打断");
                break;
            }
        }
        finished = false;
    }
}
